Type-Aligned Sequence
関数合成をリストにしたデータ構造。
関数f :: A → B と g :: B → C の合成 g . f :: A -> C を[f, g]のように表現し、先頭の関数から適用していくようなイメージ。TASeqの型は、先頭のdomainの型から末尾のcodomainの型になる。例えば上記の[f, g]の場合、スタック先頭のfのdomainの型Aから、末尾のgのcodomainの型Cによる関数の型A → Cに対応する。分解すると、[f]の場合はA → B、[g]も同様にB → Cとなる。スタックに新たな関数を積んだりスタックを合成する場合などは、このように型を整合させる必要がある。
nymphium.icon emptyの場合はどうなるんですっけ??
TASeqを用いることで、なが〜い関数合成をstack-safeにすることができる。
f_0 . f_1 . f_2 . ... . f_n (n は超でかい)のような長い関数合成を愚直に実行すると、f_0をコールスタックに積んでから引数であるf_1 . f_2 .. . f_n $ vを評価し、そうするとf_1をコールスタックに積み…となりスタックオーバーフローが起きる。
TASeqにすると[f_n, f_{n-1}, f_{n-2}, ..., f_0]のようなデータ構造になり、頭からひとつ関数を取ってvに適用して(結果をv'とする)、また頭からひとつ関数を取ってv'に適用して…となり、コールスタックのプッシュとポップをすぐにおこなうのでstack-safeになる。
スタックオーバーフローを回避する関数呼出しの方法として、トランポリン化が挙げられる。